"use strict";

import { app, protocol, BrowserWindow } from "electron";
import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
const { exec, execSync } = require("child_process");
const { dialog } = require("electron");
const path = require("path");
import axios from "axios";
import installExtension, { VUEJS3_DEVTOOLS } from "electron-devtools-installer";
// 设置日志文件存储路径为项目下的 customLogs 目录

//const isDevelopment = process.env.NODE_ENV !== 'production'
const isDevelopment = false;
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
    { scheme: "app", privileges: { secure: true, standard: true } },
]);

async function createWindow() {
    // Create the browser window.
    const win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            // Use pluginOptions.nodeIntegration, leave this alone
            // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
            nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
            contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
        },
    });

    if (process.env.WEBPACK_DEV_SERVER_URL) {
        // Load the url of the dev server if in development mode
        await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
        if (!process.env.IS_TEST) win.webContents.openDevTools();
    } else {
        createProtocol("app");
        // Load the index.html when not in development
        win.loadURL("app://./index.html");
    }
}

function quitServer() {
    return axios.get("http://127.0.0.1:5000/quit");
}

// Quit when all windows are closed.
app.on("window-all-closed", () => {
    // On macOS it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    quitServer()
        .then((res) => {
            console.log(res);
        })
        .catch((err) => {
            console.log("退出");
        })
        .finally(() => {
            if (process.platform !== "darwin") {
                app.quit();
            }
        });
});

app.on("activate", () => {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", async () => {
    // if (isDevelopment && !process.env.IS_TEST) {
    //     // Install Vue Devtools
    //     try {
    //         await installExtension(VUEJS3_DEVTOOLS);
    //     } catch (e) {
    //         console.error("Vue Devtools failed to install:", e.toString());
    //     }
    // }
    const pipPath = path.join(__static, "requirements.txt");
    createWindow();

    try {
        execSync(`pip install -r ${pipPath}`);
    } catch (error) {
        console.log(error);
    }

    const pyPath = path.join(__static, "httprunnerServer.py");
    exec(`python3 ${pyPath}`, (error, stdout, stderr) => {
        if (error) {
            console.log(`error: ${error.message}`);
            exec(`python ${pyPath}`, (error, stdout, stderr) => {
                if (error) {
                    console.log(`error: ${error.message}`);
                    return;
                }
            });
            return;
        }
    });
});

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
    if (process.platform === "win32") {
        process.on("message", (data) => {
            if (data === "graceful-exit") {
                quitServer()
                    .then((res) => {
                        console.log(res);
                    })
                    .catch((err) => {
                        console.log("退出");
                    })
                    .finally(() => {
                        if (process.platform !== "darwin") {
                            app.quit();
                        }
                    });
            }
        });
    } else {
        quitServer();
        process.on("SIGTERM", () => {
            app.quit();
        });
    }
}
